PHP 搭建环境-Docker
概述
因为下学期要学习网络安全,而靶场使用的是 ,所以这里学习一下 的基本语法
搭建环境
参考资料 使用Docker快速搭建开发环境
因为只是临时使用,所以直接使用狗哥说的 Study 或者使用 docket 搭建,洁癖的原因,这里直接使用 Docket来搭建环境
docker pull :7.2-fpm
docker pull nginx
docker pull mysql:5.7
docker pull redis:3.2
# 最后检查一下所有镜像
docker images
然后使用 docker-compose.yml 直接构建
version: "2.1"
services:
nginx:
image: nginx
ports:
- "8081:80"
volumes:
- ./nginx/www:/usr/share/nginx/html
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
networks:
- -network
:
image: :7.2-fpm
ports:
- "9003:9003"
volumes:
- ./nginx/www:/www
- ./:/usr/local/etc/ # 先生成了容器再复制出来,否则会清空容器的这个目录
# 使用 docker cp 容器ID:/usr/local/etc/ ./ 先复制出来
networks:
- -network
mysql:
image: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
volumes:
- ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./data/mysql/:/var/lib/mysql/
- ./data/init/:/docker-entrypoint-initdb.d/
- ./log/mysql/:/var/log/mysql/
networks:
- -network
networks:
-network:
driver: bridge
然后修改下 nginx 的配置文件
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.$ {
# fastcgi_pass 对应的是 容器名称
fastcgi_pass :9000;
fastcgi_index index.;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params; # 这里引入
}
}
直接启动 docket-compose
docker-compose up -d
在 www
文件夹里面创建个 index.
<?
echo info();
?>
然后访问(注意 Windows不能用 80端口,所以需要修改映射)
http://localhost:8081
安装扩展
默认 镜像中提供的扩展比较少,缺少诸如 mysql、gd2 等常用的扩展,这样就需要自己安装并启用扩展。
首先进入到 容器,用 -m
命令查看本地有什么扩展。
然后可以使用 docker--ext-install
命令来安装扩展
docker--ext-install mysql
扩展安装好之后就可以在 .ini
中启用。从 info 中可以看到,容器环境下默认的 .ini
没有启用,可以从 /usr/local/etc/
下将 .ini-development
拷贝为 .ini
。通过修改 .ini
中配置,启用自己需要的扩展。
下面是几个扩展安装的命令
docker--ext-source
在容器中创建一个 /usr/src/
目录
docker--ext-enable
启用 扩展,省去我们手工编辑 .ini
的过程
docker--ext-install
安装并启用 扩展
docker--ext-configure
经常与 docker--ext-install
搭配,在需要自定义扩展的配置时使用
如下安装 xDebug
参考资料 docker安装 xdebug 扩展
因为 版本与 xcode 版本是对应的,所以需要复制 -i 的结果到 xdebug 里面去分析
# 下载到临时文件夹
curl -L -o /tmp/xdebug-3.0.2.tgz http://xdebug.org/files/xdebug-3.0.2.tgz
# 进入临时文件夹
cd /tmp
# 解压
tar xfz xdebug-3.0.2.tgz
# 移动到扩展文件夹
mv xdebug-3.0.2/ /usr/src//ext/xdebug
# 安装 xdebug
docker--ext-install xdebug
# 启动 xdebug(如果显示目录不存在,创建一个就行了)
docker--ext-enable xdebug
再在生成的 docker--ext-xdebug.ini
文件里面加上这个
;remote_host 可选值
; docker.for.win.localhost
; docker.for.mac.localhost
; host.docker.internal
zend_extension=xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_host=docker.for.win.localhost
xdebug.remote_port=19000; xdebug的远程端口
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.idekey=VSCODE
xdebug.remote_cookie_expire_time = 3600
xdebug.remote_autostart=1
xdebug.remote_log=xdebug的日志输出地址,可加可不加
;要注意看日志这个文件有没有权限
xdebug.remote_log=/usr/local//xdebug/remote.log
; -------------------分割线----------------------------
; 上面 v2 版本的,在 v3版本已经改成下面这样
; 具体参考:https://xdebug.org/docs/upgrade_guide
zend_extension=xdebug.so
xdebug.default_enable=1
# xdebug.remote_enable=1
# xdebug.remote_host=你本机的IP地址
xdebug.client_host=host.docker.internal
# xdebug.remote_port=19000; xdebug的远程端口
;避免端口冲突,这里改成 19000,默认是 9000
xdebug.client_port = 19000
xdebug.remote_handler=dbgp
#xdebug.remote_connect_back=1
xdebug.discover_client_host=true
xdebug.mode = debug
xdebug.idekey=VSCODE
#xdebug.remote_autostart=1
xdebug.start_with_request=yes
xdebug.remote_cookie_expire_time = 3600
xdebug.log=/usr/local//xdebug/remote.log
再重启容器,使用 info 打印的页面能显示 xdebug 就行了
配置 vscode
vscode的debug配置
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "",
"request": "launch",
"port": 9003,
// "stopOnEntry": true,
"log": true,
"externalConsole": false,
"pathMappings": {
// "容器中对应的项目地址": "本机项目地址" // 绝对路径
"/var/www/html/api": "${workspaceRoot}"
}
},
{
"name": "Launch currently open script",
"type": "",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003
}
]
}
Nginx 的 fastcgi
Nginx 的 fastcgi 模块提供了 fastcgi_param 指令主要完成的工作是将 Nginx 中的变量翻译成 中能够理解的变量。
#脚本文件请求的路径,也就是说当访问 127.0.0.1/index. 的时候,需要读取网站根目录下面的 index. 文件,如果没有配置这一配置项时,nginx不会去网站根目录下访问 . 文件,所以返回空白
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string; #请求的参数;如 ?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。
fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI $document_uri; #与$uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
fastcgi_param GATEWAY_INTERFACE CGI/1.1; #cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #nginx 版本号,可修改、隐藏
fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP
fastcgi_param REMOTE_PORT $remote_port; #客户端端口
fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
fastcgi_param SERVER_PORT $server_port; #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name
fastcgi_param PATH_INFO $path_info; #可自定义变量
在 可打印出上面的服务环境变量 如:
echo $_SERVER['REMOTE_ADDR']
使用 Dockerfile 制作镜像
上面的方法还是太麻烦了,可以直接制作一个自己的 镜像,省的还要自己配置插件
创建一个叫做 dockerfile 的文件
# 从官方基础版本构建
FROM :7.2-fpm
# 官方版本默认安装扩展:
# Core, ctype, curl
# date, dom
# fileinfo, filter, ftp
# hash
# iconv
# json
# libxml
# mbstring, mysqlnd
# openssl
# pcre, PDO, pdo_sqlite, Phar, posix
# readline, Reflection, session, SimpleXML, sodium, SPL, sqlite3, standard
# tokenizer
# xml, xmlreader, xmlwriter
# zlib
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo 'deb http://mirrors.aliyun.com/debian/ buster main non-free contrib' > /etc/apt/sources.list \
&& echo 'deb http://mirrors.aliyun.com/debian-security buster/updates main' >> /etc/apt/sources.list \
&& echo 'deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib' >> /etc/apt/sources.list \
&& echo 'deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib' >> /etc/apt/sources.list \
&& apt-get update \
&& export CFLAGS="$_CFLAGS" CPPFLAGS="$_CPPFLAGS" LDFLAGS="$_LDFLAGS" \
&& apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmagickwand-dev libmcrypt-dev libmemcached-dev zlib1g-dev \
&& rm -rf /var/lib/apt/lists/* \
&& docker--ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker--ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv gd \
&& pecl install imagick-3.4.4 mcrypt-1.0.2 memcached-3.1.3 redis-5.0.2 xdebug-2.7.2 swoole-4.4.3\
&& docker--ext-enable imagick mcrypt memcached redis xdebug swoole \
&& docker--ext-configure opcache --enable-opcache && docker--ext-install opcache
LABEL Author="Stone"
LABEL Version="2019.8"
LABEL Description=" 7.2 开发环境镜像. "
输入
# -t 参数设置镜像名称和标签
docker build -t "my":"7.2" .
# 如果上面的标签没有添加上,可以手动添加
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
然后把上面的 docker-compose 改成自己的镜像
# 如果没有装上 xdebug 这里手动再安装一次
pecl install xdebug-2.7.2 # 网络不好多试几次
docker--ext-enable xdebug
# 然后再重新保存为镜像
# 把一个已有的容器保存为一个镜像
docker commit 容器名 新镜像名
再覆盖生成的 docker--ext-xdebug.ini
文件里面加上这个
zend_extension=xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9003; xdebug的远程端口
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.idekey=VSCODE
xdebug.remote_cookie_expire_time = 3600
xdebug.remote_autostart=1
复制进去
docker cp docker--ext-xdebug.ini study__1:/usr/local/etc//conf.d/docker--ext-xdebug.ini
重启容器
直接在 WSL2上使用
xdebug 上的配置
zend_extension=xdebug
;xdebug.default_enable=1
;xdebug.client_port = 9001
xdebug.remote_handler=dbgp
xdebug.discover_client_host=true
xdebug.mode = debug
;xdebug.idekey=STORM
xdebug.start_with_request=yes
;xdebug.remote_cookie_expire_time = 3600
;xdebug.log=/usr/local//xdebug/remote.log
在 vscode 的调试配置文件
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "",
"request": "launch",
"port": 9003
}
]
}
调试之前需要先启动服务,如下
-S 0.0.0.0:8080
基本的语法
脚本以 <?
开始,以 ?>
结束:
<!DOCTYPE html>
<html lang="en">
<body>
<h1>My first page</h1>
<?
$x = 5;
$y = 6;
$z = $x + $y;
echo $z;
info();
echo "Hello World!";
echo "Hello World!";
// 这是 单行注释
/*
这是
多行
注释
*/
?>
</body>
</html>